<?php

include_once MODELS."cidade.php";
include_once MODELS."localidade.php";

class ClienteModel extends Database {
    
    const TABLE = "cliente";
    
    const ID = "id";
    const NOME = "nome";
    const NASCIMENTO = "data_nascimento";
    const APELIDO = "apelido";
    const RG = "rg";
    const ORGAO_EMISSOR = "orgao_emissor";
    const CPF = "cpf";
    const CONJUGUE = "conjugue";
    const NOME_PAI = "nome_pai";
    const NOME_MAE = "nome_mae";
    const ENDERECO = "endereco";
    const NUMERO = "numero";
    const BAIRRO = "bairro";
    const REFERENCIA = "referencia";
    const CASA_PROPRIA = "casa_propria";
    const TEMPO_CASA_PROPRIA = "tempo_casa_propria";
    const OBSERVACAO = "observacao";
    const RENDA_MENSAL = "renda_mensal";
    const LOCALIDADE = "id_localidade";
    
    public function insert(Cliente $cliente) {
        $fields = array( self::NOME,self::NASCIMENTO,self::APELIDO,
                         self::RG, self::ORGAO_EMISSOR, self::CPF,self::CONJUGUE,
                         self::NOME_PAI,self::NOME_MAE,self::ENDERECO,
                         self::NUMERO,self::BAIRRO,self::REFERENCIA,
                         self::CASA_PROPRIA,self::TEMPO_CASA_PROPRIA,self::OBSERVACAO,
                         self::RENDA_MENSAL,self::LOCALIDADE);
        $values = get_object_vars($cliente);
        unset($values["id"]); 
        unset($values["telefones"]);
        if(parent::insert(self::TABLE, implode(",", $fields), Database::turnInValues($values))){
            return $this->getAnnalisses()->lastInseredtId();
        }
        return null;   
    }
    
    public function delete($id_cliente) {
        $condition = self::ID." = $id_cliente";
        return parent::delete(self::TABLE, $condition);
    }
    
    public function update(Cliente $cliente){
        $dic = array(
            self::NOME => $cliente->nome,
            self::NASCIMENTO => $cliente->nascimento,
            self::APELIDO => $cliente->apelido,
            self::RG => $cliente->rg,
            self::ORGAO_EMISSOR => $cliente->orgaoEmissor,
            self::CPF => $cliente->cpf,
            self::CONJUGUE => $cliente->conjugue,
            self::NOME_PAI => $cliente->nomePai,
            self::NOME_MAE => $cliente->nomeMae,
            self::ENDERECO => $cliente->endereco,
            self::NUMERO => $cliente->numero,
            self::BAIRRO => $cliente->bairro,
            self::REFERENCIA => $cliente->referencia,
            self::CASA_PROPRIA => $cliente->casaPropria,
            self::TEMPO_CASA_PROPRIA => $cliente->tempoCasaPropria,
            self::OBSERVACAO => $cliente->observacao,
            self::RENDA_MENSAL => $cliente->rendaMensal,
            self::LOCALIDADE => $cliente->localidade
        );
        $condition = self::ID." = ".$cliente->id;
        return parent::formattedUpdates(self::TABLE, Database::turnInUpdateValues($dic), $condition);
    }
    
    public function select($fields = " * ", $condition = null, $limit = null) {
        if(is_array($fields)) $fields = implode (",", $fields);
        $res = parent::select(self::TABLE, $fields, $condition, $limit);
        $ana = $this->getAnnalisses();
        $clientes = array();
        while(($row = $ana->fetchObject($res)) !== false){
            $clientes[] = new Cliente( 
                        isset($row->{self::ID})? $row->{self::ID} : 0,
                        isset($row->{self::NOME})? ($row->{self::NOME}) : "",
                        isset($row->{self::NASCIMENTO})? $row->{self::NASCIMENTO} : "",
                        isset($row->{self::APELIDO})? ($row->{self::APELIDO}) : "",
                        isset($row->{self::RG})? $row->{self::RG} : "",
                        isset($row->{self::ORGAO_EMISSOR})? $row->{self::ORGAO_EMISSOR}: "",        
                        isset($row->{self::CPF})? $row->{self::CPF} : "",
                        isset($row->{self::CONJUGUE})? ($row->{self::CONJUGUE}) : "",
                        isset($row->{self::NOME_PAI})? ($row->{self::NOME_PAI}) : "",
                        isset($row->{self::NOME_MAE})? ($row->{self::NOME_MAE}) : "",
                        isset($row->{self::ENDERECO})? ($row->{self::ENDERECO}) : "",
                        isset($row->{self::NUMERO})? $row->{self::NUMERO} : "",
                        isset($row->{self::BAIRRO})? ($row->{self::BAIRRO}) : "",
                        isset($row->{self::REFERENCIA})? ($row->{self::REFERENCIA}) : "",
                        isset($row->{self::CASA_PROPRIA})? $row->{self::CASA_PROPRIA} : false,
                        isset($row->{self::TEMPO_CASA_PROPRIA})? $row->{self::TEMPO_CASA_PROPRIA} : "",
                        isset($row->{self::OBSERVACAO})? ($row->{self::OBSERVACAO}) : "",
                        isset($row->{self::RENDA_MENSAL})? $row->{self::RENDA_MENSAL} : 0.0,
                        isset($row->{self::LOCALIDADE})? $row->{self::LOCALIDADE} : 0         
                    );
        }
        return $clientes;
    }
    
    public function superSelect($condition = null, $limit= null){
        $fields = array( self::TABLE.".".self::ID, self::NOME,self::NASCIMENTO,self::APELIDO,
                         self::RG, self::ORGAO_EMISSOR, self::CPF,self::CONJUGUE,
                         self::NOME_PAI,self::NOME_MAE,self::ENDERECO,
                         self::NUMERO,self::BAIRRO,self::REFERENCIA,
                         self::CASA_PROPRIA,self::TEMPO_CASA_PROPRIA,self::OBSERVACAO,
                         self::RENDA_MENSAL, LocalidadeModel::NOME, CidadeModel::NOME );
        
        $this_condition = self::LOCALIDADE." = ".LocalidadeModel::TABLE.".".LocalidadeModel::ID;
        $this_condition .= " AND ".LocalidadeModel::CIDADE." = ".CidadeModel::TABLE.".".CidadeModel::ID;
        $this_condition .= " ORDER BY ".self::NOME;
        
        if(is_null($condition)) $condition = $this_condition;
        else $condition .= " AND ".$this_condition;
        
        $tables = array(self::TABLE, LocalidadeModel::TABLE, CidadeModel::TABLE);
        
        $res = parent::select(implode(",", $tables), implode(",", $fields), $condition, $limit);
        
        $ana = $this->getAnnalisses();
        $clientes = array();
        while(($row = $ana->fetchObject($res)) !== false){
            $clientes[] = new Cliente( 
                        $row->{self::ID},
                        ($row->{self::NOME}),
                        $row->{self::NASCIMENTO},
                        ($row->{self::APELIDO}),
                        $row->{self::RG},
                        $row->{self::ORGAO_EMISSOR},        
                        $row->{self::CPF},
                        ($row->{self::CONJUGUE}),
                        ($row->{self::NOME_PAI}),
                        ($row->{self::NOME_MAE}),
                        ($row->{self::ENDERECO}),
                        $row->{self::NUMERO},
                        ($row->{self::BAIRRO}),
                        ($row->{self::REFERENCIA}),
                        $row->{self::CASA_PROPRIA},
                        $row->{self::TEMPO_CASA_PROPRIA},
                        ($row->{self::OBSERVACAO}),
                        $row->{self::RENDA_MENSAL},
                        ($row->{LocalidadeModel::NOME}." - ".$row->{CidadeModel::NOME})         
                    );
        }
        return $clientes;
    }
    
    public function selectOnlyList($condition = null){
        $fields = array( self::TABLE.".".self::ID, self::NOME, self::CPF);
        
        $res = parent::select(self::TABLE, implode(",", $fields), $condition);
        
        $ana = $this->getAnnalisses();
        $clientes = array();
        while(($row = $ana->fetchObject($res)) !== false){
            $cliente = new Cliente();
            $cliente->id = $row->{self::ID};
            $cliente->nome = $row->{self::NOME};
            $cliente->cpf = $row->{self::CPF};
            $clientes[] = $cliente;
        }
        return $clientes;
    }
    
    public function handleError() {
        $err_code = $this->errorCode(); 
        if($err_code == Annalisses::ERR_DUPLICATE) return "Não pode haver cliente duplicado";
        return parent::handleError();
    }
}
?>
